package com.david.appletree;

import android.util.Log;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxHelper extends DefaultHandler {
   public static void main(String[] args) {
//      //获取文件资源建立输入流对象
//      InputStream is = getAssets().open("person1.xml");
//      //①创建XML解析处理器
//      SaxHelper ss = new SaxHelper();
//      //②得到SAX解析工厂
//      SAXParserFactory factory = SAXParserFactory.newInstance();
//      //③创建SAX解析器
//      SAXParser parser = factory.newSAXParser();
//      //④将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器
//      parser.parse(is, ss);
//      is.close();


      //①创建XML解析处理器
      SaxHelper ss = new SaxHelper();
      //②得到SAX解析工厂
      SAXParserFactory factory = SAXParserFactory.newInstance();
      //③创建SAX解析器
      SAXParser parser = null;
      try {
         parser = factory.newSAXParser();
         //④将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器
         parser.parse("<div h='100px'></div>", ss);
      } catch (ParserConfigurationException e) {
         e.printStackTrace();
      } catch (SAXException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   private Person person;
   private ArrayList<Person> persons;
   //当前解析的元素标签
   private String tagName = null;

   /**
    * 当读取到文档开始标志是触发，通常在这里完成一些初始化操作
    */
   @Override
   public void startDocument() throws SAXException {
      this.persons = new ArrayList<Person>();
      Log.i("SAX", "读取到文档头,开始解析xml");
   }


   /**
    * 读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组
    */
   @Override
   public void startElement(String uri, String localName, String qName,
                            Attributes attributes) throws SAXException {
      if (localName.equals("person")) {
         person = new Person();
         person.setId(Integer.parseInt(attributes.getValue("id")));
         Log.i("SAX", "开始处理person元素~");
      }
      this.tagName = localName;
   }


   /**
    * 读到到内容,第一个参数为字符串内容,后面依次为起始位置与长度
    */

   @Override
   public void characters(char[] ch, int start, int length)
           throws SAXException {
      //判断当前标签是否有效
      if (this.tagName != null) {
         String data = new String(ch, start, length);
         //读取标签中的内容
         if (this.tagName.equals("name")) {
            this.person.setName(data);
            Log.i("SAX", "处理name元素内容");
         } else if (this.tagName.equals("age")) {
            this.person.setAge(Integer.parseInt(data));
            Log.i("SAX", "处理age元素内容");
         }

      }

   }

   /**
    * 处理元素结束时触发,这里将对象添加到结合中
    */
   @Override
   public void endElement(String uri, String localName, String qName)
           throws SAXException {
      if (localName.equals("person")) {
         this.persons.add(person);
         person = null;
         Log.i("SAX", "处理person元素结束~");
      }
      this.tagName = null;
   }

   /**
    * 读取到文档结尾时触发，
    */
   @Override
   public void endDocument() throws SAXException {
      super.endDocument();
      Log.i("SAX", "读取到文档尾,xml解析结束");
   }

   //获取persons集合
   public ArrayList<Person> getPersons() {
      return persons;
   }

   static class Person{
      int id, age;
      String name;

      public int getId() {
         return id;
      }

      public void setId(int id) {
         this.id = id;
      }

      public int getAge() {
         return age;
      }

      public void setAge(int age) {
         this.age = age;
      }

      public String getName() {
         return name;
      }

      public void setName(String name) {
         this.name = name;
      }
   }
}
